<?php
include_once 'armazena_erro_ou_aviso.php';
include_once 'regras_emag.php';

/**
 * 
 * Avaliador de E-mag 
 * @author fabio.oshiro
 *
 */
class AvaliadorEMAG{
	var $codHTML;
	var $codHTMLOriginal;
	/**
	 * Guarda a regra utilizada InterfNucleos.EMAG ou InterfNucleos.WCAG
	 */
	var $codWcagEmag = 1;

	var $AVISO = false;

	var $ERRO = true;

	/**
	 * Guarda se j� procurou noscript neste documento
	 */
	var $procurouNoScript = false;

	/**
	 * Guarda se tem noscript no documento
	 */
	var $temnoscript = false;

	var $cliente = array();

	var $regras;

	/**
	 * Guarda os erros e avisos desta p�gina
	 */
	var $erroOuAviso = array();

	/**
	 * Guarda os erros de mapa de imagem para revalidar Links redundantes
	 */
	var $erroMapaImagem = array();

	var $erroMapaImagemLink = array();

	/**
	 * Guarda os erros de frame que precisam de noframes para revalidar
	 */
	var $erroPedeNoFrame = array();

	var $temNoFrames = false;

	/**
	 * Guarda os links desta p�gina
	 */
	var $tagALinks = array();

	/**
	 * Guarda o último indice do arraylist de erroOuAviso atualizado com linha e
	 * coluna
	 */
	var $ultimoComLinhaColuna = 0;

	/**
	 * Guarda se a tag atual tem erro ou aviso
	 */
	var $temErroOuAviso;
	
	var $scripts;

	/**
	 * Avaliador estruturado
	 */
	public function avaliar() {
		$this->regras = new RegrasEmag();
		// Retirar comentarios de HTML
		$this->retirarComentarios();
		$this->scripts = $this->retirarScripts();
		
		preg_match_all("/\n([ \t]*)(window|document|window\.document)\.location(\.href)?=[^;]*;/", $this->scripts, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
		foreach ($matches as $val) {
			$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.5b", $this->ERRO, $this->codWcagEmag, $val[0][0]);
		}
		$this->ultimoComLinhaColuna = count($this->erroOuAviso);
		
		$podeH1aH6 = 1;
		$tagCount = 0;
		$temDocType = false;
		$erroLabel = array();
		$labelFor = array();
		$erroLabelUltimo = 0;
		// Fazer um loop pelas tags
		preg_match_all("/<[!?]?([\w]+)[^>]*>/", $this->codHTML, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
		$conta = 0;
		foreach ($matches as $val) {
			$this->temErroOuAviso = false;
			$tagIndex = $val[0][1];//$tagIndex = matcher.start();
			$tagInteira = $val[0][0];
			$tagName = strtolower($val[1][0]);
			//echo $tagName . "<br>";
			// pegar as regras desta tag, colocar as mais frequentes para cima
			$inputType = "";
			if ($tagName == "p") {
			} else if ($tagName == "doctype" && $tagCount < 3) {
				$temDocType = true;
			} else if ($tagName == "br") {
			} else if ($tagName == "div") {
			} else if ($tagName == "td") {
			} else if ($tagName == "b") {
			} else if ($tagName == "i") {
			} else if ($tagName == "a") {
				if($this->regras->verificarCliqueAqui($this->codHTML, $tagInteira, $tagIndex)===false){
					// regra de clique aqui
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.12", $this->ERRO, $this->codWcagEmag, $tagInteira);
				}
				$href = $this->regras->getAtributo($tagInteira, "href");
				if ($href != "") {
					// regra de tabindex
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.8", $this->AVISO, $this->codWcagEmag, $tagInteira);
					// Identificar claramente o destino do link
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.12", $this->AVISO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
					// Guarda o link para bater com mapas de imagens e devolver
					// aos gerentes
					$this->tagALinks[$href] = true;
					if (stripos($href,"javascript:") === 0) {
						// evitar o uso de javascript em links
						if ($this->temNoScript()) {
							// Avisar que pode n�o funcionar
							$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.19", $this->AVISO, $this->codWcagEmag, $tagInteira);
							// Erro duplicado
							$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.18", $this->AVISO, $this->codWcagEmag, $tagInteira);
						} else {
							// Erro n�o funciona sem o noscript
							$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.19", $this->ERRO, $this->codWcagEmag, $tagInteira);
						}
					}
					$target = $this->regras->getAtributo($tagInteira, "target");
					if (strtolower($target) == "_blank") {
						// Outra janela
						$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.6", $this->AVISO, $this->codWcagEmag, $tagInteira);
					}
					/*
					 * Documentos compostos por mais de uma p�gina
					 */
					$hrefLow = strtolower($href);
					if (substr($hrefLow,-4) == ".zip" || substr($hrefLow,-4) == ".tar" || substr($hrefLow,-5) == ".gzip" || substr($hrefLow,-4)==".arj") {
						$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.10", $this->AVISO, $this->codWcagEmag, $tagInteira);
					}
					/*
					 * Somente para links
					 */
					if (strtolower(substr($this->codHTML, $tagIndex-4, 4)) == "</a>") {
						// link sem espa�o adjacente
						$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.4", $this->ERRO, $this->codWcagEmag, $tagInteira);
					}
				}
			} else if ($tagName == "img") {
				// Ulizar linguagens de marca��o ao inv�s de imagens 2.7
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.7", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
				if ($this->regras->verificaIsGif($tagInteira)) {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.7", $this->AVISO, $this->codWcagEmag, $tagInteira);
				}
				if ($this->regras->getAtributo($tagInteira, "alt") == "") {
					// colocar texto alternativo
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.11", $this->ERRO, $this->codWcagEmag, $tagInteira);
				}
			} else if ($tagName == "span") {
			} else if ($tagName == "table") {
				if ($this->regras->getAtributo($tagInteira, "summary") == "") {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.13", $this->AVISO, $this->codWcagEmag, $tagInteira);
				}
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.14", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.12", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
			} else if ($tagName == "strong") {
			} else if ($tagName == "em") {
			} else if ($tagName == "ul") {
			} else if ($tagName == "ol") {
				// Evite o uso incorreto desta tag
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.3", $this->AVISO, $this->codWcagEmag, $tagInteira);
			} else if ($tagName == "li") {
			} else if ($tagName == "dt") {
				// Cita��es �blockquote�, �ul�, �dl� & �dt�, �table�
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.8", $this->AVISO, $this->codWcagEmag, $tagInteira);
			} else if ($tagName == "dd") {
			} else if ($tagName == "dl") {
				// Cita��es �blockquote�, �ul�, �dl� & �dt�, �table�
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.8", $this->AVISO, $this->codWcagEmag, $tagInteira);
			} else if ($tagName == "th") {
				// N�o usar th para formatar texto em bold
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.13", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
			} else if ($tagName == "tt") {
			} else if ($tagName == "tr") {
			} else if ($tagName == "input") {
				// Verifica a regra de Label
				$inputType = strtolower($this->regras->getAtributo($tagInteira, "type"));
				if($inputType!="hidden" && $inputType!="submit" && $inputType!="imagem") $erroLabel[] = new ArmazenaErroOuAviso("2.15", $this->ERRO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
				// Verifica regra de texto predefinido em text e password
				/* REGRA EM DESUSO
				if ($this->regras->verificaTextoPredefinidoInput($tagInteira)===false) {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.14", $this->ERRO, $this->codWcagEmag, $tagInteira);
				}*/
				// verifica se n�o � do tipo hidden
				if ($inputType == "hidden") {
					// regra de tabindex
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.8", $this->AVISO, $this->codWcagEmag, $tagInteira);
					// regra de posicionamento de r�tulo
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.16", $this->AVISO, $this->codWcagEmag, $tagInteira);
				}
			} else if ($tagName == "select") {
				// Verifica a regra de Label
				$erroLabel[] = new ArmazenaErroOuAviso("2.15", $this->ERRO, $this->codWcagEmag, $tagInteira);
				// regra de tabindex
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.8", $this->AVISO, $this->codWcagEmag, $tagInteira);
				// regra de posicionamento de r�tulo
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.16", $this->AVISO, $this->codWcagEmag, $tagInteira);
				// Evitar o envio autom�tico
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.13", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
			} else if ($tagName == "option") {
			} else if ($tagName == "optgroup") {
			} else if ($tagName == "area") {
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.8", $this->AVISO, $this->codWcagEmag, $tagInteira);
				// Links redundantes
				$href = $this->regras->getAtributo($tagInteira, "href");
				if ($href != "") {
					$erro = new ArmazenaErroOuAviso("1.12", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->erroMapaImagem[] = $erro;
					//$this->erroOuAviso[] = $erro;
					$this->erroMapaImagemLink[] = $href;
				}
				$this->temErroOuAviso = true;
			} else if ($tagName == "label") {
				$key = $this->regras->getAtributo($tagInteira, "for");
				if($key != "") $labelFor[$key] = true;
			} else if ($tagName == "legend") {
			} else if ($tagName == "button") {
				/*
				 * HTML 4
				 */
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.8", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
			} else if ($tagName == "map") {
				/*
				 * HTML 3.2
				 */
			} else if ($tagName == "hr") {
			} else if ($tagName == "meta") {
				if (strtolower($this->regras->getAtributo($tagInteira, "http-equiv")) == "refresh") {
					// n�o dar refresh nem redirect
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.4", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.5", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
				}
			} else if ($tagName == "title") {
			} else if ($tagName == "link") {
				/*
				 * Verificar se � de CSS
				 */
				if ($this->regras->verificaIsCSS($tagInteira)===false) {
					// Pagina legivel sem style
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.6", $this->AVISO, $this->codWcagEmag, $tagInteira);
					// Contraste
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.5", $this->AVISO, $this->codWcagEmag, $tagInteira);
					// Info com cor tamb�m sem cor
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.4", $this->AVISO, $this->codWcagEmag, $tagInteira);
				
					$this->temErroOuAviso = true;
				}
			} else if ($tagName == "style") {
				// Info com cor tamb�m sem cor
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.4", $this->AVISO, $this->codWcagEmag, $tagInteira);
				// Contraste
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.5", $this->AVISO, $this->codWcagEmag, $tagInteira);
				// Pagina legivel sem style
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.6", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
			} else if ($tagName == "script") {
				// verificar se possui noscript
				if ($this->temNoScript()===false) {
					//$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.11", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.20", $this->ERRO, $this->codWcagEmag, $tagInteira);
				}
				// Evitar p�ginas contendo movimento
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.23", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
			} else if ($tagName == "noscript") {
			} else if ($tagName == "caption") {
			} else if ($tagName == "form") {
			} else if ($tagName == "textarea") {
				// Verifica a regra de Label
				$erroLabel[] = new ArmazenaErroOuAviso("2.15", $this->ERRO, $this->codWcagEmag, $tagInteira);
				// Verifica regra de texto predefinido
				//if ($this->regras->verificaTextoPredefinidoTextarea($this->codHTML, $tagInteira, $tagIndex)===false) {
					//$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.14", $this->ERRO, $this->codWcagEmag, $tagInteira);
				//}
			
				// regra de tabindex
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.8", $this->AVISO, $this->codWcagEmag, $tagInteira);
				// regra de posicionamento de r�tulo
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.16", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
			} else if ($tagName == "blockquote") {
				// Cita��es �blockquote�, �ul�, �dl� & �dt�, �table�
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.8", $this->AVISO, $this->codWcagEmag, $tagInteira);
			} else if ($tagName == "head") {
			} else if ($tagName == "pre") {
			} else if ($tagName == "h1") {
				$podeH1aH6 = 2;
			} else if ($tagName == "h2") {
				if (2 > $podeH1aH6) {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.10", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
				}
				$podeH1aH6 = 3;
			} else if ($tagName == "h3") {
				if (3 > $podeH1aH6) {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.10", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
				}
				$podeH1aH6 = 4;
			} else if ($tagName == "h4") {
				if (4 > $podeH1aH6) {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.10", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
				}
				$podeH1aH6 = 4;
			} else if ($tagName == "h5") {
				if (5 > $podeH1aH6) {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.10", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
				}
				$podeH1aH6 = 5;
			} else if ($tagName == "h6") {
				if (6 > $podeH1aH6) {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.10", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
				}
				$podeH1aH6 = 6;
			} else if ($tagName == "body") {
			} else if ($tagName == "html") {
				// Verificar se possui o atributo lang
				if ($this->regras->verificaLang($tagInteira)===false
					//&& $this->regras->getAtributo($tagInteira, "xml:lang")=="" //por enquanto nao substitui o lang
					) {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.1", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
				}
			} else if ($tagName == "sub") {
				/*
				 * HTML 3.2
				 */
			} else if ($tagName == "sup") {
				/*
				 * HTML 3.2
				 */
			} else if ($tagName == "frameset") {
			} else if ($tagName == "frame") {
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.15", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
				if ($this->regras->verificaLongDesc($tagInteira)===false) {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.18", $this->AVISO, $this->codWcagEmag, $tagInteira);
				}
				$erro = new ArmazenaErroOuAviso("1.16", $this->ERRO, $this->codWcagEmag, $tagInteira);
				//$this->erroOuAviso[] = $erro;
				$this->erroPedeNoFrame[] = $erro;
				if ($this->regras->getAtributo($tagInteira, "title") == "") {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.17", $this->ERRO, $this->codWcagEmag, $tagInteira);
				}
			} else if ($tagName == "noframes") {
				/*
				 * Guarda que possui noframe
				 */
				$this->temNoFrames = true;
			} else if ($tagName == "iframe") {
				/*
				 * DTD transitional e frameset
				 */
				// equivalentes atualizados
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.15", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
				if ($this->regras->verificaLongDesc($tagInteira) === false) {
					// Descrever a finalidade dos frames
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.18", $this->AVISO, $this->codWcagEmag, $tagInteira);
				}
				if ($this->regras->getAtributo($tagInteira, "title") == "") {
					// Dar a cada frame um t�tulo
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.17", $this->ERRO, $this->codWcagEmag, $tagInteira);
				}
				if ($this->regras->verificaTextoIframe($this->codHTML, $tagInteira, $tagIndex) === false) {
					// Texto dentro do iframe
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.16", $this->ERRO, $this->codWcagEmag, $tagInteira);
				}
			} else if ($tagName == "fieldset") {
				/*
				 * HTML4
				 */
			} else if ($tagName == "colgroup") {
				/*
				 * HTML4
				 */
			} else if ($tagName == "thead") {
				/*
				 * HTML4
				 */
			} else if ($tagName == "tfoot") {
				/*
				 * HTML4
				 */
			} else if ($tagName == "tbody") {
				/*
				 * HTML4
				 */
			} else if ($tagName == "q") {
				/*
				 * HTML4
				 */
			} else if ($tagName == "address") {
			} else if ($tagName == "object") {
				/*
				 * Flash e outros
				 */
				// Piscar
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.7", $this->AVISO, $this->codWcagEmag, $tagInteira);
				// Avisar que pode não funcionar
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.19", $this->AVISO, $this->codWcagEmag, $tagInteira);
				// Erro ou aviso duplicado da 1.19
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.18", $this->AVISO, $this->codWcagEmag, $tagInteira);
				// Legendas em movies
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.22", $this->AVISO, $this->codWcagEmag, $tagInteira);
				// Movimento sem controle
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.23", $this->AVISO, $this->codWcagEmag, $tagInteira);
				if ($this->regras->verificarTextoEmObject($this->codHTML, $tagInteira, $tagIndex)===false) {
					// Texto dentro da tag object
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.11", $this->ERRO, $this->codWcagEmag, $tagInteira);
				}
				$this->temErroOuAviso = true;
			} else if ($tagName == "base") {
			} else if ($tagName == "param") {
				/*
				 * HTML 3.2
				 */
			} else if ($tagName == "layer") {
				/*
				 * Non standard
				 */
			} else if ($tagName == "small") {
				/*
				 * Renders as smaller text � relativo
				 */
			} else if ($tagName == "big") {
				/*
				 * Renders as bigger text � relativo
				 */
			} else if ($tagName == "col") {
				/*
				 * Defines the attribute values for one or more columns in a
				 * table. You can only use this element inside a table or a
				 * colgroup.
				 */
			} else if ($tagName == "ins") {
				/*
				 * HTML4
				 */
			} else if ($tagName == "del") {
				/*
				 * HTML4
				 */
			} else if ($tagName == "dfn") {
				/*
				 * Indicates that this is the defining instance of the enclosed
				 * term.
				 */
			} else if ($tagName == "code") {
				/*
				 * Designates a fragment of computer code.
				 */
			} else if ($tagName == "samp") {
				/*
				 * Designates sample output from programs, scripts, etc.
				 */
			} else if ($tagName == "kbd") {
				/*
				 * Indicates text to be entered by the user.
				 */
			} else if ($tagName == "var") {
				/*
				 * Indicates an instance of a variable or program argument.
				 */
			} else if ($tagName == "cite") {
				/*
				 * Contains a citation or a reference to other sources.
				 */
			} else if ($tagName == "abbr") {
				/*
				 * Indicates an abbreviated form (e.g., WWW, HTTP, URI, Mass.,
				 * etc.).
				 */
			} else if ($tagName == "acronym") {
				/*
				 * Indicates an acronym (e.g., WAC, radar, etc.).
				 */
			} else if ($tagName == "bdo") {
				/*
				 * HTML 4 http://www.w3.org/TR/html4/struct/dirlang.html#h-8.2.4
				 */
			} else {
				/*
				 * Tag desconhecida verificar se � Deprecated ou Non standard
				 */
				if ($this->regras->verificaDeprecatedNonStandard($tagName) === false) {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.1", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
				}
				if ($tagName == "applet") {
					// tela piscando
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.7", $this->AVISO, $this->codWcagEmag, $tagInteira);
					// Avisar que pode n�o funcionar
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.19", $this->AVISO, $this->codWcagEmag, $tagInteira);
					// Erro ou aviso duplicado da 1.19
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.18", $this->AVISO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
					// Movimento sem controle
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.23", $this->AVISO, $this->codWcagEmag, "");
				}
			}
			/*
			 * Verifica��o geral para todas as tags
			 */
			if ($this->regras->verificaPossuiStyle($tagInteira)) {
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.6", $this->AVISO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
				if ($tagName != "applets" && $tagName != "object" && $tagName != "img") {
					// erro de tamanho fixo as imagens, objetos, applets podem
					// ter tamanho fixo
					if ($this->regras->verificaTamFixoEmAtributoStyle($tagInteira) === false) {
						$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.2", $this->ERRO, $this->codWcagEmag, $tagInteira);
					}
				}
				if ($this->regras->verificaCorStyleInline($tagInteira)) {
					// possui bg ou color no estilo
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.4", $this->AVISO, $this->codWcagEmag, $tagInteira);
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.5", $this->AVISO, $this->codWcagEmag, $tagInteira);
				}
			}
			if(stripos($tagInteira, "accesskey=\"f\"") !== false ){
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("4.1",$this->ERRO,codWcagEmag, $tagInteira);
			}
			if ($tagName != "applets" && $tagName != "object" && $tagName != "img") {
				// erro de tamanho fixo as imagens, objetos, applets podem
				// ter tamanho fixo
				if ($this->regras->verificaTamFixoAtributoWidhtHeight($tagInteira)) {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.2", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
				}
			}
			/*
			 * resposta a eventos
			 */
			$onclick = $this->regras->getAtributo($tagInteira, "onclick");
			$onmousedown = $this->regras->getAtributo($tagInteira, "onmousedown");
			$onmouseup = $this->regras->getAtributo($tagInteira, "onmouseup");
			$onmouseover = $this->regras->getAtributo($tagInteira, "onmouseover");
			$onmouseout = $this->regras->getAtributo($tagInteira, "onmouseout");
			$onkeydown = $this->regras->getAtributo($tagInteira, "onkeydown");
			$onkeyup = $this->regras->getAtributo($tagInteira, "onkeyup");
			$onkeypress = $this->regras->getAtributo($tagInteira, "onkeypress");
			$onfocus = $this->regras->getAtributo($tagInteira, "onfocus");
			$onblur = $this->regras->getAtributo($tagInteira, "onblur");
			if (($tagName == "a" || $inputType == "buttom" || $inputType == "reset" || $inputType == "submit") === false) {
				// verificar onclick menos nestes elementos
				if ($onclick != "" && $onkeypress != "") {
					$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.19", $this->ERRO, $this->codWcagEmag, $tagInteira);
					$this->temErroOuAviso = true;
				}
			}
			if ($onmousedown != "" && $onkeydown == "") {
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.19", $this->ERRO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
			}
			if ($onmouseup != "" && $onkeyup == "") {
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.19", $this->ERRO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
			}
			if ($onmouseover != "" && $onfocus == "") {
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.19", $this->ERRO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
			}
			if ($onmouseout != "" && $onblur == "") {
				$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.19", $this->ERRO, $this->codWcagEmag, $tagInteira);
				$this->temErroOuAviso = true;
			}
			/*
			 * caso tenha erro(s) retornar a linha e a coluna. O cod do erro �
			 * colocado antes
			 */
			if ($this->temErroOuAviso) {
				// pegar a linha e a coluna da tag
				$linha = 1;
				$coluna = 0;
				$aux = strpos($this->codHTML,"\n", 0);
				$laux = $aux;
				while ($aux !== false && $aux < $tagIndex) {
					$laux = $aux;
					$aux = strpos($this->codHTML, "\n", $aux + 1);
					$linha++;
				}
				// calcula a coluna
				$coluna = $tagIndex - $laux;
				// Dar um loop pelos erros guardados e colocar a linha e a
				// coluna
				$this->setColLine($this->erroOuAviso, $this->ultimoComLinhaColuna, $linha, $coluna);
				$this->setColLine($erroLabel, $erroLabelUltimo, $linha, $coluna);
				/*
				$erroOuAvisoSize = count($this->erroOuAviso);
				for ($i = $this->ultimoComLinhaColuna; $i < $erroOuAvisoSize; $i++) {
					$this->erroOuAviso[$i]->setLinha($linha);
					$this->erroOuAviso[$i]->setColuna($coluna);
				}
				$this->ultimoComLinhaColuna = $erroOuAvisoSize;
				*/
				//trace("Erro na linha " + linha + " coluna " + coluna + "\n");
				$this->temErroOuAviso = false;
			}
			$tagCount++;
			//trace("\n");
		}

		/*
		 * Verifica��o depois de ter os dados da p�gina
		 */
		//trace("Verifica��o depois de ter os dados da p�gina\n");
		$erroMapaImagemSize = count($this->erroMapaImagem);
		for ($i = 0; $i < $erroMapaImagemSize; $i++) {
			// Colocar os que não possuirem links redundantes
			if (!isset($this->tagALinks[$this->erroMapaImagemLink[$i]])){
				$this->erroOuAviso[] = $this->erroMapaImagem[$i];
			}
		}
		$erroLabelSize = count($erroLabel);
		for ($i = 0; $i < $erroLabelSize; $i++) {
			// Colocar os que não possuirem label
			$eId = $this->regras->getAtributo($erroLabel[$i]->getTagCompleta(), 'id');
			if (!isset($labelFor[$eId])){
				$this->erroOuAviso[] = $erroLabel[$i];
			}
		}
		if ($this->temNoFrames===false) {
			// colocar os erros que pedem noframe
			$erroPedeNoFrameSize = count($this->erroPedeNoFrame);
			for ($i = 0; $i < $erroPedeNoFrameSize; $i++) {
				$this->erroOuAviso[] = $this->erroPedeNoFrame[$i];
			}
		}
		if (!$temDocType) {
			// Coloca o erro de doctype quanto este n�o existe
			$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.1", $this->ERRO, $this->codWcagEmag, "");
		}
		if (count($this->tagALinks) > 3) {
			// Agrupar links
			$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.7", $this->AVISO, $this->codWcagEmag, "");
		}
		/*
		 * Colocar os avisos gerais
		 */
		$this->carregarAvisosGerais();

		/*
		 * Fim da avalia��o desta p�gina
		 */

		/*
		 * Verificar os clientes
		 */
		if ($this->cliente != null) {
			/*
			 * separar os erros
			 */
			$erroP1  = array();//new ArrayList<ArmazenaErroOuAviso>();
			$erroP2  = array();//new ArrayList<ArmazenaErroOuAviso>();
			$erroP3  = array();//new ArrayList<ArmazenaErroOuAviso>();
			$avisoP1 = array();//new ArrayList<ArmazenaErroOuAviso>();
			$avisoP2 = array();//new ArrayList<ArmazenaErroOuAviso>();
			$avisoP3 = array();//new ArrayList<ArmazenaErroOuAviso>();
			$tot = count($this->erroOuAviso);
			for ($j = 0; $j < $tot; $j++) {
				
				$priori = $this->regras->getPrioridadeRegra($this->erroOuAviso[$j]->getIdTextoRegra());
				switch ($priori) {
				case 1:
					if ($this->erroOuAviso[$j]->isAviso()) {
						$avisoP1[] = $this->erroOuAviso[$j];
					} else {
						$erroP1[] = $this->erroOuAviso[$j];
					}
					break;
				case 2:
					if ($this->erroOuAviso[$j]->isAviso()) {
						$avisoP2[] = $this->erroOuAviso[$j];
					} else {
						$erroP2[] = $this->erroOuAviso[$j];
					}
					break;
				case 3:
					if ($this->erroOuAviso[$j]->isAviso()) {
						$avisoP3[] = $this->erroOuAviso[$j];
					} else {
						$erroP3[] = $this->erroOuAviso[$j];
					}
					break;
				}
			}
			/*
			 * Mandar os erros para os clientes
			 */
			$tot = count($this->cliente);
			for ($i = 0; $i < $tot; $i++) {
				$this->cliente[$i]->linksAchadosPeloNucleo($this->tagALinks);
				$this->cliente[$i]->errosP1($erroP1);
				$this->cliente[$i]->errosP2($erroP2);
				$this->cliente[$i]->errosP3($erroP3);
				$this->cliente[$i]->avisosP1($avisoP1);
				$this->cliente[$i]->avisosP2($avisoP2);
				$this->cliente[$i]->avisosP3($avisoP3);
			}
			/*
			 * Mandar sinal de termino para os clientes
			 */
			for ($i = 0; $i < $tot; $i++) {
				$this->cliente[$i]->fimDaAvaliacao();
			}
		}
		return $this->erroOuAviso;
	}

	private function setColLine(&$array, &$ultimo, $linha, $coluna){
		$erroOuAvisoSize = count($array);
		for ($i = $ultimo; $i < $erroOuAvisoSize; $i++) {
			$array[$i]->setLinha($linha);
			$array[$i]->setColuna($coluna);
		}
		$ultimo = $erroOuAvisoSize;
	}
	
	/**
	 * Carrega os avisos gerais no arraylist $this->erroOuAviso
	 */
	function carregarAvisosGerais() {
		/*
		 * Mudan�as de idioma
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.2", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * Ignorar arte ascii
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.3", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * Utilizar a linguagem mais clara e simples poss�vel
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.9", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * navega��o de maneira coerente
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.10", $this->AVISO, $this->codWcagEmag, "");
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.21", $this->AVISO, $this->codWcagEmag, "");
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("1.24", $this->AVISO, $this->codWcagEmag, "");
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.9", $this->AVISO, $this->codWcagEmag, "");
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.11", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * Fornecer mapa
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("2.17", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * Abreviaturas
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.2", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * Fornecer atalho
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.3", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * Prefer�ncias (por ex., por idioma ou por tipo de conte�do).
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.5", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * BreadCrumb
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.6", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * fun��es de pesquisa
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.8", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * front-loading
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.9", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * Documentos compostos por mais de uma p�gina
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.10", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * Complementar o texto com imagens, etc.
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.11", $this->AVISO, $this->codWcagEmag, "");
		/*
		 * Forne�a metadados.
		 */
		$this->erroOuAviso[] = new ArmazenaErroOuAviso("3.14", $this->AVISO, $this->codWcagEmag, "");

	}

	function retirarScripts(){
		$start = '<script';
		$end = '</script>';
		$endLen = strlen($end);
		$endSpaces = str_repeat(' ', $endLen); 
		$ini = strpos($this->codHTML, $start);
		$retorno = ' ';
		while ($ini !== false) {
			$ini = strpos($this->codHTML, '>',$ini);
			if($ini===false) break;
			$ini++;
			$enters = "";
			$fim = strpos($this->codHTML, $end, $ini);
			// contar os enters
			for ($i = $ini; $i < $fim; $i++) {
				$c = $this->codHTML[$i];
				if ($c == "\n" || $c == "\t" || $c == "\r") {
					$enters .= $c;
				} else {
					$enters .= " ";
				}
				$retorno .= $c;
			}
			$this->codHTML = substr($this->codHTML, 0, $ini) . $enters . substr($this->codHTML, $fim);
			$ini = strpos($this->codHTML, $start, $ini);
		}
		return $retorno;
	}
	
	/**
	 * Retira os comentários de HTML, porém manter as linhas e colunas
	 */
	function retirarComentarios() {
		$ini = strpos($this->codHTML, "<!--");
		while ($ini !== false) {
			// procurar o "-->"
			$enters = "";
			$fim = strpos($this->codHTML, "-->", $ini);
			// contar os enters
			for ($i = $ini; $i < $fim; $i++) {
				$c = $this->codHTML[$i];
				if ($c == "\n" || $c == "\t" || $c == "\r") {
					// mant�m os enters, tabs, etc.
					$enters .= $c;
				} else {
					// mant�m a coluna
					$enters .= " ";
				}
			}
			// Os referente a -->
			$enters .= "   ";
			
			$this->codHTML = substr($this->codHTML, 0, $ini) . $enters . substr($this->codHTML, $fim + 3);
			$ini = strpos($this->codHTML, "<!--", $ini);
		}
	}

	function addCliente($objCliente) {
		$this->cliente[] = objCliente;
	}

	function setWCAGEMAG($ConstRegra) {
		$this->codWcagEmag = $ConstRegra;
		switch ($ConstRegra) {
		case InterfNucleos.EMAG:
			$this->regras = new RegrasEmag();
			break;
		case InterfNucleos.WCAG:
			//$this->regras = new RegrasWcag();
			break;
		default:
			$this->regras = new RegrasEmag();
			break;
		}
	}

	function setCodHTML($codigo) {
		$this->codHTMLOriginal = $codigo;
		$this->codHTML = $codigo;
	}

	function getCodHTML() {
		return $this->codHTML;
	}

	function getCodHTMLOriginal() {
		return $this->codHTMLOriginal;
	}

	/**
	 * Verifica se existe a tag noscript no documento
	 * 
	 * @return true caso exista
	 */
	function temNoScript() {
		if ($this->procurouNoScript === false) {
			$this->temnoscript = $this->regras->verificaNoscript($this->codHTML);
			$this->procurouNoScript = true;
		}
		return $this->temnoscript;
	}

}
